﻿using System;
using System.Windows.Forms;
using System.Linq;
using System.Collections.Generic;
using System.Data;

namespace Smart
{
    public partial class frmEvrak : Form
    {
        public EvrakTipleri EvrakTipi { get; set; }
        public Cari SecilenCari { get; set; }
        public string Seri { get; set; }
        public int Sira { get; set; }
        public string BelgeNo { get; set; }
        public DateTime Tarih { get; set; }
        public string SorMerkezKodu { get; set; }
        public string DepoKodu { get; set; }
        public bool EskiEvrak { get; set; }
        public Dictionary<int, decimal> _dovizKurlari = new Dictionary<int, decimal>();

        private List<HareketBilgileri> _hareketler = new List<HareketBilgileri>();
        private HareketBilgileri activate_row;
        private DataTable GridData = new DataTable();
        private string bulunamayanBarkod = string.Empty;

        private void StokBul(string filtre, bool stokKodGore)
        {
            using (Query q = new Query(ProgramTipleri.Mikro))
            {
                q.Add(BackOffice.Get.StokBilgi(filtre, stokKodGore));
                var sonuc = q.ToList(new
                {
                    stokid = 0,
                    stokkod = "",
                    stokadi = "",
                    bartipi = byte.MinValue,
                    baricerik = byte.MinValue,
                    barbirimpntr = byte.MinValue,
                    birim1ad = "",
                    birim1kat = 0d,
                    birim2ad = "",
                    birim2kat = 0d,
                    birim3ad = "",
                    birim3kat = 0d,
                    birim4ad = "",
                    birim4kat = 0d,
                    barkod = "",
                    fiyat = 0d,
                    doviz = "",
                    kdv = 0
                }).FirstOrDefault();

                if (sonuc != null)
                {
                    txtBarkod.Text = sonuc.barkod;
                    txtFiyat.Text = sonuc.fiyat.ToString();
                    txtMiktar.Text = "1";
                    txtStokAdi.Text = sonuc.stokadi;
                    txtStokKodu.Text = sonuc.stokkod;
                    lblDoviz.Text = sonuc.doviz;
                    lblDoviz.Tag = sonuc.kdv;

                    if (!string.IsNullOrEmpty(bulunamayanBarkod))
                    {
                        DialogResult res = MessageBox.Show(string.Format("{0} barkodu bu ürüne eklemek istediğinize eminmisiniz ?", bulunamayanBarkod), "Uyarı", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);
                        if (res == DialogResult.Yes)
                        {
                            int birimid = 1;
                            if (cmbBirim.SelectedIndex > -1)
                            {
                                birimid = cmbBirim.SelectedIndex + 1;
                            }
                            BackOffice.Get.BarkodEkle(bulunamayanBarkod, txtStokKodu.Text, birimid);
                            bulunamayanBarkod = string.Empty;
                        }
                    }

                    cmbBirim.Items.Clear();
                    if (!string.IsNullOrEmpty(sonuc.birim1ad))
                        cmbBirim.Items.Add(new ComboItem() { Text = sonuc.birim1ad, Value = sonuc.birim1kat });
                    if (!string.IsNullOrEmpty(sonuc.birim2ad))
                        cmbBirim.Items.Add(new ComboItem() { Text = sonuc.birim2ad, Value = sonuc.birim2kat });
                    if (!string.IsNullOrEmpty(sonuc.birim3ad))
                        cmbBirim.Items.Add(new ComboItem() { Text = sonuc.birim3ad, Value = sonuc.birim3kat });
                    if (!string.IsNullOrEmpty(sonuc.birim4ad))
                        cmbBirim.Items.Add(new ComboItem() { Text = sonuc.birim4ad, Value = sonuc.birim4kat });

                    if (sonuc.barbirimpntr <= cmbBirim.Items.Count)
                    {
                        cmbBirim.SelectedIndex = sonuc.barbirimpntr - 1;
                    }
                    else
                    {
                        if (cmbBirim.Items.Count > 0)
                        {
                            cmbBirim.SelectedIndex = 0;
                        }
                    }
                    txtMiktar.SelectAll();
                    txtMiktar.Focus();
                }
                else
                {
                    string brk = txtBarkod.Text;
                    ClearAllText();
                    txtBarkod.Text = brk;
                    if (Program.Session[Settings.TanimsizBarkod].ToString() == "True")
                    {
                        DialogResult res = MessageBox.Show("Barkod Bulunamadı ! Kaydetmek istermisiniz ?", "Uyarı", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);
                        if (res == DialogResult.Yes)
                        {
                            bulunamayanBarkod = txtBarkod.Text;
                            cmbBirim.Items.Add(new ComboItem() { Text = "Adet", Value = 1 });
                            cmbBirim.Items.Add(new ComboItem() { Text = "Paket", Value = 2 });
                            cmbBirim.Items.Add(new ComboItem() { Text = "Koli", Value = 3 });
                            cmbBirim.Items.Add(new ComboItem() { Text = "Palet", Value = 4 });
                            cmbBirim.SelectedIndex = 0;
                            MessageBox.Show("Eklemek istediğiniz Ürünü arayıp bulunuz,Birimi'de aşağıdan seçebilirsiniz.");
                        }
                    }
                    else
                        MessageBox.Show("Barkod Bulunamadı !");
                    txtBarkod.SelectAll();
                    txtBarkod.Focus();
                }
            }
        }

        private void EvrakOku()
        {
            using (Query q = new Query(ProgramTipleri.Mikro))
            {
                q.Add(BackOffice.Get.EvrakDetaySql(this.EvrakTipi, this.Seri, this.Sira));
                var sonuc = q.ToList(new
                {
                    tarih = DateTime.Now,
                    belgeno = "",
                    seri = "",
                    sira = 0,
                    satir = 0,
                    carikod = "",
                    sipdbc = 0,
                    siprec = 0,
                    srmkod = "",
                    id = 0,
                    stokkod = "",
                    stokadi = "",
                    miktar = 0d,
                    fiyat = 0d,
                    isk1 = 0d,
                    isk2 = 0d,
                    isk3 = 0d,
                    isk4 = 0d,
                    isk5 = 0d,
                    tutar = 0d,
                    kdvsira = 0,
                    kdvtutar = 0d,
                    girisdepo = 0,
                    cikisdepo = 0,
                    barkod = ""
                });

                if (sonuc.Count > 0 && !string.IsNullOrEmpty(sonuc[0].carikod))
                {
                    q.Add(BackOffice.Get.CariBilgi(sonuc[0].carikod));
                    var cari = q.ToList(new { id = 0, Adi = "", Adres = "", Kodu = "", VergiDaire = "", VergiNo = "" }).FirstOrDefault();
                    if (cari != null)
                        SecilenCari = new Cari() { Adi = cari.Adi, Adres = cari.Adres, Id = cari.id, Kodu = cari.Kodu, VergiDaire = cari.VergiDaire, VergiNo = cari.VergiNo };
                }

                foreach (var item in sonuc)
                {
                    _hareketler.Add(new HareketBilgileri()
                    {
                        Barkod = item.barkod,
                        BelgeNo = item.belgeno,
                        BurutTutar = item.tutar,
                        CariKodu = item.carikod,
                        CikisDepoNo = item.cikisdepo,
                        Fiyat = item.fiyat,
                        GirisDepoNo = item.girisdepo,
                        Id = item.id,
                        Isk1Tutar = item.isk1,
                        Isk2Tutar = item.isk2,
                        Isk3Tutar = item.isk3,
                        Isk4Tutar = item.isk4,
                        Isk5Tutar = item.isk5,
                        KdvSira = item.kdvsira,
                        KdvTutari = item.kdvtutar,
                        Miktar = item.miktar,
                        Satir = item.satir,
                        Seri = item.seri,
                        SipDbcNo = item.sipdbc,
                        SipRecNo = item.siprec,
                        Sira = item.sira,
                        SrmMerkezKodu = item.srmkod,
                        StokAdi = item.stokadi,
                        StokKodu = item.stokkod,
                        Tarih = item.tarih
                    });
                    GridData.Rows.Add(item.stokadi, item.miktar, item.fiyat, item.barkod);
                }
            }
        }

        private void SatirEkle()
        {
            int katsayi = 1;
            if (Program.Session[Settings.BirinciBirimAktif].ToString() != "True")
            {
                if (cmbBirim.SelectedIndex > -1)
                {
                    katsayi = Cevir.Parse<int>(((ComboItem)cmbBirim.SelectedItem).Value);
                    if (katsayi == 0)
                    {
                        katsayi = 1;
                    }
                    else if (katsayi < 0)
                    {
                        katsayi = katsayi * (-1);
                    }
                }
            }

            if (activate_row == null)
            {
                HareketBilgileri row = new HareketBilgileri();
                row.Seri = Seri;
                row.Sira = Sira;
                row.Satir = BackOffice.Get.MaxSatir(EvrakTipi, Seri, Sira);
                if (SecilenCari != null)
                {
                    row.CariKodu = SecilenCari.Kodu;
                }
                else
                {
                    row.CariKodu = "";
                }
                row.Tarih = Tarih;
                row.BelgeNo = BelgeNo;
                row.SrmMerkezKodu = this.SorMerkezKodu;
                row.Id = -1;
                row.StokKodu = txtStokKodu.Text;
                row.StokAdi = txtStokAdi.Text;
                row.Barkod = txtBarkod.Text;
                row.Miktar = Cevir.Parse<double>(txtMiktar.Text) * katsayi;
                row.KdvSira = Cevir.Parse<int>(lblDoviz.Tag);
                if (this.EvrakTipi == EvrakTipleri.GelenDepoSevk)
                {
                    row.GirisDepoNo = Program.Session.VarsayilanDepo();
                    row.CikisDepoNo = Cevir.Parse<int>(this.DepoKodu);
                }
                else if (this.EvrakTipi == EvrakTipleri.GidenDepoSevk)
                {
                    row.CikisDepoNo = Program.Session.VarsayilanDepo();
                    row.GirisDepoNo = Cevir.Parse<int>(this.DepoKodu);
                }
                else
                {
                    row.CikisDepoNo = Program.Session.VarsayilanDepo();
                    row.GirisDepoNo = Program.Session.VarsayilanDepo();
                }

                if (!string.IsNullOrEmpty(this.SorMerkezKodu))
                    row.SrmMerkezKodu = this.SorMerkezKodu;
                else
                    row.SrmMerkezKodu = Program.Session[Settings.SrmMerkez].ToString();

                row.Fiyat = Cevir.Parse<double>(txtFiyat.Text) * DovizKur(DovizNo(lblDoviz.Text));
                row.BurutTutar = row.Fiyat * row.Miktar;
                BackOffice.Get.MikroEkle(ref row, EvrakTipi);
                _hareketler.Add(row);
                GridData.Rows.Add(txtStokAdi.Text, Cevir.Parse<decimal>(txtMiktar.Text), Cevir.Parse<decimal>(txtFiyat.Text), txtBarkod.Text);
            }
            else
            {
                GridData.Rows[gridView1.CurrentRowIndex][1] = Cevir.Parse<decimal>(txtMiktar.Text);
                GridData.Rows[gridView1.CurrentRowIndex][2] = Cevir.Parse<decimal>(txtFiyat.Text);

                activate_row.Miktar = Cevir.Parse<double>(txtMiktar.Text) * katsayi;
                activate_row.Fiyat = Cevir.Parse<double>(txtFiyat.Text);
                activate_row.BurutTutar = activate_row.Fiyat * activate_row.Miktar;
                BackOffice.Get.MikroEkle(ref activate_row, EvrakTipi);
                activate_row = null;
            }
            ClearAllText();
        }

        private byte DovizNo(string sembol)
        {
            switch (sembol)
            {
                case "USD":
                    return 1;
                case "EUR":
                    return 2;
                case "CAD":
                    return 3;
                case "DKK":
                    return 4;
                default:
                    return 0;
            }
        }

        private double DovizKur(byte idx)
        {
            if (_dovizKurlari.ContainsKey(idx))
            {
                return Cevir.Parse<double>(_dovizKurlari[idx]);
            }
            else
                return 1d;
        }

        private void StokListele(string filtre, bool stokKodaGore)
        {
            using (Query q = new Query(ProgramTipleri.Mikro))
            {
                q.Add(BackOffice.Get.StokListSql(filtre, stokKodaGore));
                var list = q.ToList(new { barkod = "", Kodu = "", Adi = "" });
                gridView2.SuspendLayout();
                gridView2.DataSource = list;
                gridView2.SetColumnStyles(list, new[] 
                                            { 
                                                new ColumnStyle("Stok Adı","Adi", 250),
                                                new ColumnStyle("Stok Kodu","Kodu", 150),
                                                new ColumnStyle("Barkod","barkod", 150)
                                            });
                gridView2.ResumeLayout();
                tabControl1.SelectedIndex = 1;
                gridView2.AutoSizeCol();
            }
        }

        private void ClearAllText()
        {
            lblDoviz.Tag = null;
            lblDoviz.Text = string.Empty;
            txtMiktar.Text = string.Empty;
            txtBarkod.Text = string.Empty;
            txtStokKodu.Text = string.Empty;
            txtStokAdi.Text = string.Empty;
            txtFiyat.Text = string.Empty;
            activate_row = null;
            cmbBirim.Items.Clear();
            txtBarkod.Focus();
        }

        private void SatirSil()
        {
            if (gridView1.CurrentRowIndex > -1)
            {
                int row = gridView1.CurrentRowIndex;
                int shar_id = _hareketler[row].Id;
                if (shar_id > -1)
                {
                    BackOffice.Get.SharSil(shar_id);
                    _hareketler.RemoveAt(row);
                    GridData.Rows.RemoveAt(row);
                    ClearAllText();
                }
            }
        }

        public frmEvrak()
        {
            InitializeComponent();
            GridData.Columns.Add("Stok Adı", typeof(string));
            GridData.Columns.Add("Miktar", typeof(decimal));
            GridData.Columns.Add("Fiyat", typeof(decimal));
            GridData.Columns.Add("Barkod", typeof(string));
            gridView1.VeriKaynagi = GridData;
            gridView1.Columns[0].Width = 175;
            gridView1.Columns[1].Width = 40;
            gridView1.Columns[2].Width = -1;
            gridView1.Columns[3].Width = -1;
            this.Load += new EventHandler(frmEvrak_Load);
            this.Activated += new EventHandler(frmEvrak_Activated);
        }

        void frmEvrak_Activated(object sender, EventArgs e)
        {
            txtBarkod.Focus();
        }

        void frmEvrak_Load(object sender, EventArgs e)
        {
            using (Query q = new Query(ProgramTipleri.SqlCe))
            {
                q.Add("select doviz_no,doviz_kur FROM TBL_DOVIZ");
                var sonuc = q.ToList(new { no = 0, kur = 0m });
                foreach (var item in sonuc)
                {
                    if (!_dovizKurlari.ContainsKey(item.no))
                    {
                        _dovizKurlari.Add(item.no, item.kur);
                    }
                }
            }

            if (this.EskiEvrak)
            {
                EvrakOku();
            }
            this.Text = string.Format("Seri={0} - Sira={1}", this.Seri, this.Sira);
            txtSeri.Text = this.Seri;
            txtSira.Text = this.Sira.ToString();
            if (SecilenCari != null)
            {
                txtCari.Text = SecilenCari.Adi;
            }
            txtBarkod.Focus();
        }

        private void btnKodu_Click(object sender, EventArgs e)
        {
            StokListele(txtBarkod.Text, true);
        }

        private void btnAdi_Click(object sender, EventArgs e)
        {
            StokListele(txtStokAdi.Text, false);
        }

        private void txtBarkod_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                StokBul(txtBarkod.Text, false);
            }
        }

        private void txtStokKodu_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                StokBul(txtStokKodu.Text, true);
            }
        }

        bool sipShow = false;
        private void toolbarControl1_ItemEntered(object sender, EventArgs e)
        {
            switch (toolbarControl1.SelectedIndex)
            {
                case 0:
                    if (!sipShow)
                    {
                        sipShow = true;
                        Sip.Show();
                    }
                    else
                    {
                        sipShow = false;
                        Sip.Hide();
                    }
                    break;
                case 1:
                    txtfinder.Visible = true;
                    txtfinder.SelectAll();
                    txtfinder.Focus();
                    break;
                case 2:
                    if (!string.IsNullOrEmpty(txtStokKodu.Text) && !string.IsNullOrEmpty(txtStokAdi.Text) && !string.IsNullOrEmpty(txtMiktar.Text) && Cevir.Parse<decimal>(txtMiktar.Text) > 0)
                    {
                        SatirEkle();
                    }
                    else
                        MessageBox.Show("Eksik Bilgi girdiniz !");
                    break;
                case 3:
                    SatirSil();
                    break;
                case 4:
                    ClearAllText();
                    break;
                case 5:
                    this.Close();
                    break;
            }
        }

        private void txtMiktar_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (!string.IsNullOrEmpty(txtStokKodu.Text) && !string.IsNullOrEmpty(txtStokAdi.Text) && !string.IsNullOrEmpty(txtMiktar.Text) && Cevir.Parse<decimal>(txtMiktar.Text) > 0)
                {
                    SatirEkle();
                }
                else
                    MessageBox.Show("Eksik Bilgi girdiniz !");
            }
        }

        private void gridView1_DoubleClick(object sender, EventArgs e)
        {
            if (gridView1.CurrentRowIndex > -1)
            {
                activate_row = _hareketler[gridView1.CurrentRowIndex];
                if (activate_row != null)
                {
                    StokBul(activate_row.Barkod, false);
                    txtMiktar.Text = activate_row.Miktar.ToString();
                    txtFiyat.Text = activate_row.Fiyat.ToString();
                }
            }
        }

        private void gridView2_DoubleClick(object sender, EventArgs e)
        {
            if (gridView2.CurrentRowIndex > -1)
            {
                string stkokod = gridView2[gridView2.CurrentRowIndex, 1].ToString();
                StokBul(stkokod, true);
                tabControl1.SelectedIndex = 0;
                txtMiktar.SelectAll();
                txtMiktar.Focus();
            }
        }

        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                int row = -1;
                for (int i = 0; i < _hareketler.Count; i++)
                {
                    if (_hareketler[i].Barkod == txtfinder.Text)
                    {
                        row = i;
                        break;
                    }
                }

                if (row > -1)
                {
                    gridView1.CurrentRowIndex = row;
                    activate_row = _hareketler[row];
                    if (activate_row != null)
                    {
                        StokBul(activate_row.Barkod, false);
                        txtMiktar.Text = activate_row.Miktar.ToString();
                        txtFiyat.Text = activate_row.Fiyat.ToString();
                    }
                }
                txtfinder.Text = "Barkodu buraya okutun";
                txtfinder.Visible = false;
            }
        }

        private void btnStokBilgileri_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(txtStokKodu.Text))
            {
                frmStokBilgi bilgi = new frmStokBilgi();
                bilgi.Barkod = txtBarkod.Text;
                bilgi.ShowDialog();
            }
        }
    }
}